/*
Copyright (C) 2008 raohmaru <http://www.raohmaru.com>

This file is part of Raohmaru AS3 Framework.

Raohmaru AS3 Framework is free software:you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Raohmaru AS3 Framework is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with Raohmaru AS3 Framework.  If not, see <http://www.gnu.org/licenses/>.
*/

package jp.raohmaru.geom 
{
import flash.display.Graphics;

/**
 * La clase LineStyle representa un objeto que contiene los parámetros que acepta el método <code>Graphics.lineStyle()</code>, lo que permite almacenarlos
 * para un posterior uso en varios objetos Graphics.
 * @see flash.display.Graphics
 * @author raohmaru
 * @version 1.0
 */
public class LineStyle 
{
	private var _thickness :Number,
				_color :uint,
				_alpha :Number,
				_pixelHinting :Boolean,
				_scaleMode :String,
				_caps :String,
				_joints :String,
				_miterLimit :Number;

	
	/**
	 * Entero que indica el grosor de la línea en puntos; los valores válidos son del 0 al 255. Si no se especifica ningún número o si el parámetro no está definido (undefined), no se traza ninguna línea. Si se pasa un valor inferior a 0, el valor predeterminado es 0. El valor 0 indica grosor muy fino; el grosor máximo es 255. Si se pasa un valor superior a 255, el valor predeterminado es 255. 
	 * @default 0
	 */
	public function get thickness() :Number
	{
		return _thickness;
	}	
	public function set thickness(value :Number) :void
	{
		_thickness = value;
	}
	
	/**
	 * Valor de color hexadecimal de la línea; por ejemplo, rojo es 0xFF0000, azul es 0x0000FF, etc. Si no se indica ningún valor, el valor predeterminado es 0x000000 (negro). Opcional.
	 * @default 0
	 */
	public function get color() :uint
	{
		return _color;
	}	
	public function set color(value :uint) :void
	{
		_color = value;
	}
	
	/**
	 * Número que indica el valor alfa del color de la línea; los valores válidos van del 0 al 1. Si no se indica ningún valor, el valor predeterminado es 1 (sólido). Si el valor es inferior a 0, el valor predeterminado es 0. Si el valor es superior a 1, el valor predeterminado es 1. 
	 * @default 1.0
	 */
	public function get alpha() :Number
	{
		return _alpha;
	}	
	public function set alpha(value :Number) :void
	{
		_alpha = value;
	}
	
	/**
	 * Un valor booleano que especifica si se permite o no sugerir trazos a píxeles completos. Esto afecta a la posición de los anclajes de una curva y al tamaño propiamente dicho del trazo de la línea. Con <code>pixelHinting</code> definido con el valor <code>true</code>, Flash Player sugiere anchuras de línea que ocupen la anchura completa de los píxeles. Con <code>pixelHinting</code> definido con el valor <code>false</code>, pueden aparecer curvas y líneas rectas no conectadas.
	 * @default false
	 */
	public function get pixelHinting() :Boolean
	{
		return _pixelHinting;
	}	
	public function set pixelHinting(value :Boolean) :void
	{
		_pixelHinting = value;
	}
	
	/**
	 * Un valor de la clase LineScaleMode que especifica el modo de escala que debe utilizarse.
	 * @default LineScaleMode.NORMAL
	 * @see flash.display.LineScaleMode
	 */
	public function get scaleMode() :String
	{
		return _scaleMode;
	}	
	public function set scaleMode(value :String) :void
	{
		_scaleMode = value;
	}
	
	/**
	 * Valor de la clase CapsStyle que especifica el tipo de final de línea.
	 * @default null
	 * @see flash.display.CapsStyle
	 */
	public function get caps() :String
	{
		return _caps;
	}	
	public function set caps(value :String) :void
	{
		_caps = value;
	}
	
	/**
	 * Valor de la clase JointStyle que especifica el tipo de junta utilizado en los ángulos.
	 * @default null
	 * @see flash.display.JointStyle
	 */
	public function get joints() :String
	{
		return _joints;
	}	
	public function set joints(value :String) :void
	{
		_joints = value;
	}
	
	/**
	 * Número que indica el límite en que se corta una esquina. Los valores posibles están comprendidos entre 1 y 255. Este valor sólo se utiliza si <code>jointStyle</code> se define como <code>JointStyle.MITER</code>. El valor de <code>miterLimit</code> representa la longitud con la que una esquina se puede extender más allá del punto en que las líneas se cortan para formar una unión. El valor expresa un factor del valor de <code>thickness</code> (grosor) de la línea. Por ejemplo, con un factor <code>miterLimit</code> de 2,5 y un valor <code>thickness</code> (grosor) de 10 píxeles, la esquina se corta a los 25 píxeles. 
	 * @default 3
	 */
	public function get miterLimit() :Number
	{
		return _miterLimit;
	}	
	public function set miterLimit(value :Number) :void
	{
		_miterLimit = value;
	}
	
	
	/**
	 * Crea un nuevo objeto LineStyle con los parámetros establecidos.
	 * @param thickness Grosor de la linea.
	 * @param color Color de la línea.
	 * @param alpha Transparencia de la línea.
	 * @param pixelHinting Especifica si se permite o no sugerir trazos a píxeles completos.
	 * @param scaleMode El modo de escala que debe utilizarse.
	 * @param caps El tipo de final de línea.	 * @param joints El tipo de junta utilizado en los ángulos.	 * @param miterLimit Indica el límite en que se corta una esquina.
	 */
	public function LineStyle(thickness :Number = 0, color :uint = 0, alpha :Number = 1.0, pixelHinting :Boolean = false, scaleMode :String = "normal", caps :String = null, joints :String = null, miterLimit :Number = 3)
	{
		_thickness = thickness;		_color = color;		_alpha = alpha;		_pixelHinting = pixelHinting;		_scaleMode = scaleMode;		_caps = caps;		_joints = joints;		_miterLimit = miterLimit;
	}
	
	/**
	 * Aplica el estilo de línea actual al objeto Graphics especificado.
	 * @param graphics Objeto Graphics al que aplicar el estilo de la instancia de LineStyle.
	 */
	public function applyToGraphics(graphics :Graphics) :void
	{
		graphics.lineStyle(thickness, color, alpha, pixelHinting, scaleMode, caps, joints, miterLimit);
	}
}
}